package org.ciallo.simplemusicplayer.viewmodel;

import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Transformations;
import org.ciallo.simplemusicplayer.data.model.Song;
import org.ciallo.simplemusicplayer.data.repository.SongRepository;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Jukomu
 * @Description: 搜索功能的 ViewModel
 * 负责处理搜索逻辑并将结果暴露给 SearchActivity
 * @Package: org.ciallo.simplemusicplayer.data.model
 * @Project: SimpleMusicPlayer
 * @name: PlaylistSongCrossRef
 * @Date: 2025/5/30-00:58
 * @Filename: PlaylistSongCrossRef
 */
public class SearchViewModel extends AndroidViewModel {

    private final SongRepository songRepository;
    // private ArtistRepository artistRepository; // 后续扩展
    // private AlbumRepository albumRepository;  // 后续扩展

    // 用于触发搜索的 LiveData，包含查询字符串
    private final MutableLiveData<String> searchQuery = new MutableLiveData<>();

    // 搜索结果 LiveData (歌曲)
    // 使用 Transformations.switchMap，当 searchQuery 改变时，会重新执行搜索并更新结果
    public final LiveData<List<Song>> songResults;

    // 后续可以添加 LiveData for artistResults, albumResults

    // 指示是否正在搜索 (可以用于显示加载指示器)
    private final MutableLiveData<Boolean> _isLoading = new MutableLiveData<>(false);
    public final LiveData<Boolean> isLoading = _isLoading;


    public SearchViewModel(@NonNull Application application) {
        super(application);
        songRepository = new SongRepository(application);
        // artistRepository = new ArtistRepository(application); // 后续
        // albumRepository = new AlbumRepository(application); // 后续

        songResults = Transformations.switchMap(searchQuery, query -> {
            _isLoading.postValue(true); // 开始搜索前设置加载状态
            if (query == null || query.trim().isEmpty()) {
                // 如果查询为空，返回一个包含空列表的 LiveData
                _isLoading.postValue(false);
                MutableLiveData<List<Song>> emptyListLiveData = new MutableLiveData<>();
                emptyListLiveData.setValue(new ArrayList<>());
                return emptyListLiveData;
            }
            LiveData<List<Song>> results = songRepository.searchSongs(query);
            // 在这里，我们依赖 results LiveData 的观察者来更新 _isLoading 为 false
            // 或者，如果 searchSongs 是一个挂起函数并返回 List<Song>，我们可以在这里直接 postValue(false)
            // 当前 searchSongs 返回 LiveData，所以加载状态的结束依赖于其观察者的第一次回调
            // 为了简化，我们可以假设加载在数据返回时结束，但更精确的控制可能需要Repository层返回带有加载状态的Wrapper类
            return Transformations.map(results, songList -> {
                _isLoading.postValue(false); // 当结果实际返回时，设置加载结束
                return songList;
            });
        });
    }

    /**
     * 设置新的搜索查询词，这将触发搜索操作。
     * @param query 要搜索的关键词。
     */
    public void setSearchQuery(String query) {
        String trimmedQuery = (query != null) ? query.trim() : "";
        // 只有当查询词与上一次不同时才更新，以避免不必要的重复搜索
        if (!trimmedQuery.equals(searchQuery.getValue())) {
            searchQuery.setValue(trimmedQuery);
        } else if (trimmedQuery.isEmpty() && (songResults.getValue() == null || !songResults.getValue().isEmpty())) {
            // 如果查询为空，并且当前结果不为空，也触发一次更新以清空结果
            searchQuery.setValue(trimmedQuery);
        }
    }

    /**
     * (可选) 清除搜索查询和结果。
     */
    public void clearSearch() {
        setSearchQuery(""); // 设置为空查询会清空结果
    }
}

